package com.ruoyi.kanban.mapper;

import java.util.List;
import com.ruoyi.kanban.domain.SequenceNumber;
import org.apache.ibatis.annotations.Param;

/**
 * 流水号记录Mapper接口
 * 
 * @author ruoyi
 * @date 2025-01-15
 */
public interface SequenceNumberMapper 
{
    /**
     * 查询流水号记录
     * 
     * @param id 流水号记录主键
     * @return 流水号记录
     */
    public SequenceNumber selectSequenceNumberById(Long id);

    /**
     * 根据key查询流水号记录
     * 
     * @param seqKey 流水号key
     * @return 流水号记录
     */
    public SequenceNumber selectSequenceNumberByKey(String seqKey);

    /**
     * 查询流水号记录列表
     * 
     * @param sequenceNumber 流水号记录
     * @return 流水号记录集合
     */
    public List<SequenceNumber> selectSequenceNumberList(SequenceNumber sequenceNumber);

    /**
     * 新增流水号记录
     * 
     * @param sequenceNumber 流水号记录
     * @return 结果
     */
    public int insertSequenceNumber(SequenceNumber sequenceNumber);

    /**
     * 修改流水号记录
     * 
     * @param sequenceNumber 流水号记录
     * @return 结果
     */
    public int updateSequenceNumber(SequenceNumber sequenceNumber);

    /**
     * 删除流水号记录
     * 
     * @param id 流水号记录主键
     * @return 结果
     */
    public int deleteSequenceNumberById(Long id);

    /**
     * 批量删除流水号记录
     * 
     * @param ids 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteSequenceNumberByIds(Long[] ids);

    /**
     * 使用乐观锁更新序列号
     * 
     * @param seqKey 流水号key
     * @param currentSeq 当前序列号
     * @param version 当前版本号
     * @return 更新结果
     */
    public int updateSequenceWithLock(@Param("seqKey") String seqKey, 
                                    @Param("currentSeq") Long currentSeq, 
                                    @Param("version") Integer version);

    /**
     * 使用乐观锁将序列号重置为指定值（允许向下对齐）。
     *
     * @param seqKey 流水号key
     * @param expectedVersion 期望版本（用于乐观锁）
     * @param newSeq 重置后的序列值
     * @return 更新结果
     */
    public int resetSequenceToValue(@Param("seqKey") String seqKey,
                                    @Param("expectedVersion") Integer expectedVersion,
                                    @Param("newSeq") Long newSeq);
}